package br.com.jmmarca.controller;

//import br.com.jmmarca.model.EventoProduto;
import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.TabHost.TabSpec;
import android.widget.Toast;
import br.com.jmmarca.dao.impl.CorDAO;
import br.com.jmmarca.dao.impl.EventoDAO;
import br.com.jmmarca.dao.impl.EventoProdutoDAO;
import br.com.jmmarca.dao.impl.ProdutoDAO;
import br.com.jmmarca.model.Cor;
import br.com.jmmarca.model.Evento;
import br.com.jmmarca.model.EventoProduto;
import br.com.jmmarca.model.Produto;
import br.com.jmmarca.util.Utils;

public class CrudEventoProduto extends GenericTabActivity {

	private static final String TAG_LOG = "App_crudevento";
	List<EventoProduto> listaEventoProdutos = new ArrayList<EventoProduto>();
	EventoProdutoDAO gerenciador;
	EventoDAO eventoDAO;
	ProdutoDAO produtoDAO;
	CorDAO corDAO;
	Integer idRegistro = null;

	Spinner corReferencia = null;
	Spinner evento = null;
	Spinner produto = null;

	List<Evento> listagemEvento;
	List<Produto> listagemProduto;
	List<Cor> listagemCor;
	ArrayAdapter<Evento> dataAdapterEvento;
	ArrayAdapter<Produto> dataAdapterProduto;
	ArrayAdapter<Cor> dataAdapterCor;

	ListView listaEventosProdutoListView;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.evento_produto_main);
		gerenciador = EventoProdutoDAO.getInstance(getApplicationContext());
		eventoDAO = EventoDAO.getInstance(getApplicationContext());
		produtoDAO = ProdutoDAO.getInstance(getApplicationContext());
		corDAO = corDAO.getInstance(getApplicationContext());

		evento = (Spinner) findViewById(R.id.spinner_evp_eventos);
		corReferencia = (Spinner) findViewById(R.id.spinner_evp_cor_referencia);
		produto = (Spinner) findViewById(R.id.spinner_evp_produtos);

		Button salvar = (Button) findViewById(R.id.btnSalvar);
		salvar.setOnClickListener(onSave);
		Button cancelar = (Button) findViewById(R.id.btnCancelar);
		cancelar.setOnClickListener(onCancel);

		TabSpec descritor = getTabHost().newTabSpec("tag1");
		descritor.setContent(R.id.EventoProdutos);
		descritor.setIndicator("Listar",
				getResources().getDrawable(R.drawable.lista));
		getTabHost().addTab(descritor);

		descritor = getTabHost().newTabSpec("tag2");
		descritor.setContent(R.id.detalhesEventoProduto);
		descritor.setIndicator("Cadastrar",
				getResources().getDrawable(R.drawable.add));
		getTabHost().addTab(descritor);

		getTabHost().setCurrentTab(1);

		carregaListagem();
		registerForContextMenu(listaEventosProdutoListView);
		addItemsOnEvento();
		evento.setOnItemSelectedListener(new OnItemSelectedListener() {
			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int pos, long id) {
				Evento ev = (Evento) parent.getItemAtPosition(pos);
				if (ev != null) {
					addItemsOnProduto(ev);
				}
			}

			@Override
			public void onNothingSelected(AdapterView<?> parentView) {
				// your code here
			}
		});

	}

	// add items into spinner dynamically
	public void addItemsOnEvento() {
		listagemEvento = eventoDAO.listar();

		dataAdapterEvento = new ArrayAdapter<Evento>(this,
				android.R.layout.simple_spinner_item, listagemEvento);
		dataAdapterEvento
				.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		evento.setAdapter(dataAdapterEvento);

		addItemsOnProduto(null);
	}

	// add items into spinner dynamically
	public void addItemsOnProduto(Evento ev) {
		if (ev != null && idRegistro == null) {
			listagemProduto = produtoDAO
					.listarPor(
							"id not in (select(id_produto) from evento_produto where id_evento=?)",
							new String[] { String.valueOf(ev.getId()) });
		} else if (ev != null && idRegistro != null) {
			EventoProduto evp = gerenciador.encontrar(idRegistro);
			listagemProduto = produtoDAO
					.listarPor(
							"id not in (select(id_produto) from evento_produto where id_evento=?) or id in (?)",
							new String[] { String.valueOf(ev.getId()), String.valueOf(evp.getIdProduto()) });			
		} else {
			listagemProduto = new ArrayList<Produto>();
		}
		dataAdapterProduto = new ArrayAdapter<Produto>(this,
				android.R.layout.simple_spinner_item, listagemProduto);
		dataAdapterProduto
				.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		produto.setAdapter(dataAdapterProduto);

		addItemsOnCores(ev);
	}

	// add items into spinner dynamically
	public void addItemsOnCores(Evento ev) {
		if (ev != null && idRegistro == null) {
			listagemCor = corDAO
					.listarPor(
							"id not in (select (id_cor) from evento_produto where id_evento=?)",
							new String[] { String.valueOf(ev.getId()) });
		} else if (ev != null && idRegistro != null) {
			EventoProduto evp = gerenciador.encontrar(idRegistro);
			listagemCor = corDAO
					.listarPor(
							"id not in (select (id_cor) from evento_produto where id_evento=?) or id in (?)",
							new String[] { String.valueOf(ev.getId()), String.valueOf(evp.getIdCor()) });			
		} else {
			listagemCor = new ArrayList<Cor>();
		}

		dataAdapterCor = new ArrayAdapter<Cor>(this,
				android.R.layout.simple_spinner_item, listagemCor);
		dataAdapterCor
				.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		corReferencia.setAdapter(dataAdapterCor);
	}

	public void carregaFormulario() {
		if (idRegistro != null) {
			EventoProduto eventoProduto = gerenciador.encontrar(idRegistro);

			Evento eventoSalvo = eventoDAO.encontrar(eventoProduto
					.getIdEvento());
			Produto produtoSalvo = produtoDAO.encontrar(eventoProduto
					.getIdProduto());
			Cor corSalvo = corDAO.encontrar(eventoProduto
					.getIdCor());
			
			addItemsOnEvento();
			evento.setSelection(dataAdapterEvento.getPosition(eventoSalvo));
			addItemsOnProduto(eventoSalvo);
			produto.setSelection(dataAdapterProduto.getPosition(produtoSalvo));
			addItemsOnCores(eventoSalvo);
			corReferencia.setSelection(dataAdapterCor.getPosition(corSalvo));
			
		} else {
			evento.setSelected(false);
			produto.setSelected(false);
			corReferencia.setSelected(false);
		}
	}

	private void carregaListagem() {
		listaEventosProdutoListView = (ListView) findViewById(R.id.EventoProdutos);

		listaEventoProdutos = gerenciador.listar();
		ArrayAdapter<EventoProduto> adapter = new ArrayAdapter<EventoProduto>(
				this, android.R.layout.simple_list_item_1, listaEventoProdutos);

		listaEventosProdutoListView.setAdapter(adapter);

		listaEventosProdutoListView.setOnItemClickListener(onListClick);
	}

	private void salvarCadastro() {
		if (evento.getSelectedItem() == null) {
			Toast msg = Toast.makeText(this, "O Campo Evento é requerido!",
					Toast.LENGTH_LONG);
			msg.show();
			return;
		}
		if (produto.getSelectedItem() == null) {
			Toast msg = Toast.makeText(this, "O Campo produto é requerido!",
					Toast.LENGTH_LONG);
			msg.show();
			return;
		}

		Log.w(TAG_LOG, "Salvando Cadastro");

		EventoProduto eventoSalvar = new EventoProduto(idRegistro);
		eventoSalvar.setIdEvento(((Evento) evento.getSelectedItem()).getId());
		eventoSalvar
				.setIdProduto(((Produto) produto.getSelectedItem()).getId());
		eventoSalvar.setIdCor(((Cor) corReferencia.getSelectedItem()).getId());
		gerenciador.salvar(eventoSalvar);

		// Atualiza lista
		listaEventoProdutos = gerenciador.listar();
		carregaListagem();
		getTabHost().setCurrentTab(0);
		// Registro selecionado
		idRegistro = null;
		carregaFormulario();
		addItemsOnProduto((Evento) evento.getSelectedItem());

		Toast msg = Toast.makeText(this, "Dado Salvo com Sucesso!",
				Toast.LENGTH_LONG);
		msg.show();
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	private OnItemClickListener onListClick = new OnItemClickListener() {

		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			EventoProduto ev = listaEventoProdutos.get((int) id);
			idRegistro = ev.getId();
			if (idRegistro != null) {
				carregaFormulario();
			}

			getTabHost().setCurrentTab(1);
		}
	};

	private OnClickListener onSave = new OnClickListener() {

		@Override
		public void onClick(View arg0) {
			salvarCadastro();
		}
	};
	private OnClickListener onCancel = new OnClickListener() {

		@Override
		public void onClick(View arg0) {
			idRegistro = null;
			carregaFormulario();
			carregaListagem();
			// Volta para Listagem
			getTabHost().setCurrentTab(0);
		}
	};

	/**
	 * MENU DA LISTAGEM
	 */
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) {
		super.onCreateContextMenu(menu, v, menuInfo);
		if (v.getId() == R.id.EventoProdutos) {
			AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
			EventoProduto registroSelecionado = (EventoProduto) listaEventosProdutoListView
					.getItemAtPosition(acmi.position);
			idRegistro = registroSelecionado.getId();
			MenuInflater inflater = getMenuInflater();
			inflater.inflate(R.menu.menu_listagem, menu);

		}
	}

	@Override
	public boolean onContextItemSelected(MenuItem item) {
		EventoProduto registroSelecionado = gerenciador.encontrar(idRegistro);
		switch (item.getItemId()) {
		case R.id.menu_base_alterar:
			// add stuff here
			idRegistro = registroSelecionado.getId();
			if (idRegistro != null) {
				carregaFormulario();
			}

			getTabHost().setCurrentTab(1);

			return true;
		case R.id.menu_base_remover:
			try {
				gerenciador.remover(registroSelecionado);
				Utils.msg(getApplicationContext(),
						"Registro Removido com Sucesso!");
				carregaListagem();
			} catch (Exception e) {
				Utils.msg(getApplicationContext(),
						"Não foi possivel remover, verifique se não existe dependencias!");
			}
			idRegistro = null;
			addItemsOnEvento();
			return true;
		default:
			return super.onContextItemSelected(item);
		}
	}

}